package com.dkd.sbtz.mapper;

import java.util.List;
import java.util.Map;

import com.dkd.sbtz.domain.AssetMtplan;
import com.dkd.sbtz.domain.AssetWorkOrder;
import com.dkd.sbtz.domain.ordervo.*;
import com.dkd.sbtz.domain.vo.PlanQuery;
import org.apache.ibatis.annotations.Param;
/**
 * 工单列表Mapper接口
 * 
 * @author xzj
 * @date 2025-09-09
 */
public interface AssetWorkOrderMapper 
{
    /**
     * 查询工单列表列表
     * 
     * @param assetWorkOrder 工单列表
     * @return 工单列表集合
     */
    public List<AssetWorkOrder> selectAssetWorkOrderList(AssetWorkOrder assetWorkOrder);

    /**
     * 新增工单列表
     * 
     * @param assetWorkOrder 工单列表
     * @return 结果
     */
//    public AssetWorkOrder selectAssetWorkOrderById(Long id);
//    public int insertAssetWorkOrder(AssetWorkOrder assetWorkOrder);
//    public int updateAssetWorkOrder(AssetWorkOrder assetWorkOrder);

    /**
     * 删除工单列表
     * 
     * @param id 工单列表主键
     * @return 结果
     */
    public int deleteAssetWorkOrderById(Long id);

    /**
     * 批量删除工单列表
     * 
     * @param ids 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteAssetWorkOrderByIds(Long[] ids);



    /*工单报表echarts相关*/
    // 工单状态分布（创建时间范围）
    List<StatusCountVO> byStatus(@Param("begin") String begin, @Param("end") String end);

    // 创建 vs 完成（日维度趋势）
    List<DailyCountVO> dailyCreated(@Param("begin") String begin, @Param("end") String end);
    List<DailyCountVO> dailyDone(@Param("begin") String begin, @Param("end") String end);

    // 未完成老化分桶（基于 created_at 到当前）
    List<AgingBucketVO> agingBuckets();

    // 类型分类：数量 + 工时
    List<TypeAggVO> byType(@Param("begin") String begin, @Param("end") String end);

    // PM 占比（数量 & 工时）
    PMShareVO pmShare(@Param("begin") String begin, @Param("end") String end);
    /*工单报表echarts相关完毕*/



    /*查询工单信息 带设备台账和备件信息*/
    List<ListNodeAndSpare> selectListNodeAndSpare(@Param("q") AssetWorkOrder q);


    /*根据设备id查询工单信息*/
    List<ListNodeAndSpare> selectByNodeId(@Param("nodeId") Long nodeId);



    int insertAssetWorkOrder(AssetWorkOrder wo);

    int updateAssetWorkOrder(AssetWorkOrder wo);

    // ✅ 这三个方法是你 XML 最后的备件相关 SQL，对应 upsert / 软删
    int upsertList(@Param("orderId") Long orderId,
                   @Param("assetId") Long assetId,
                   @Param("items") java.util.List<AssetWorkOrder.SpareItem> items,
                   @Param("user") String user);

    int softDeleteNotIn(@Param("orderId") Long orderId,
                        @Param("spareIds") java.util.List<Long> spareIds,
                        @Param("user") String user);

    int softDeleteAll(@Param("orderId") Long orderId,
                      @Param("user") String user);


    int hardDeleteAll(@Param("orderId")Long orderId);


    AssetWorkOrder selectAssetWorkOrderById(Long id);



    /** 第一步：只查主表ID（分页命中这里） */
    List<Long> selectAosIdsPage(@Param("q") OrderSpareHistoryQuery q);

    // ✅ 新定义的分页查询：返回复合键对象（代替 Long id）
    List<OrderSpareKey> selectAosKeysPage(@Param("q") OrderSpareHistoryQuery q);

    // ✅ 第二段详情联查：用复合键匹配
    List<OrderSpareHistoryVO> selectOrderSpareByKeys(
            @Param("keys") List<OrderSpareKey> keys,
            @Param("q") OrderSpareHistoryQuery q);

    /** 第二步：根据ID列表做联表拉取详情并排序 */
    List<OrderSpareHistoryVO> selectOrderSpareByIds(@Param("ids") List<Long> ids,
                                                    @Param("q") OrderSpareHistoryQuery q);





    List<AssetWorkOrder> selectPage(@Param("p") Map<String, Object> p);
    List<AssetWorkOrder.OrderSpareDTO> listByOrderIds(@Param("orderIds") List<Long> orderIds);


    /** upsert 工单-备件关系 */
    int insertOrUpdateWorkOrderSpare(
            @Param("orderId") Long orderId,
            @Param("assetId") Long assetId,
            @Param("spareId") Long spareId,
            @Param("qty") Integer qty,
            @Param("user") String user
    );


    List<Long> selectInUseSpareIds(@Param("spareIds") List<Long> spareIds);

}
